約 2,387,445 件
https://w.atwiki.jp/lmes2/pages/170.html
Rails のインストール 概要 タイトルのまんま。 前提条件 Ruby 本体のインストール 手順 コマンドラインで「c \ruby\bin」から gem install rails --remote --include-dependencies を実行。 この処理はともすれば10分以上かかる。 not found (428.jpg)
https://w.atwiki.jp/kobuchi/pages/41.html
10000系(10030系・10050系・10080系)通勤型電車 実車について 車両増備と7300系の置き換えを目的として、1984年(昭和59年)より製造が開始された通勤型電車。 先に登場していた東上線・有楽町線直通用9000系の地上専用版・東武全線対応車として設計されている。 このため車体見付は基本的に9000系と同一ながら、分割併合を考慮して幌枠つきの貫通扉が中央に設置され、印象が大きく異なる車両となった。 制御方式は東武では初となるバーニア式界磁チョッパ制御を採用、ブレーキ装置も回生ブレーキ併用電気指令式ブレーキ(HRD-1)となり、 日光線新栃木以北などの勾配区間用に抑速ブレーキも備えている。 1988年(昭和63年)にはマイナーチェンジ車である10030系が登場したが、コルゲートを廃したビードプレス車体の採用とともに、 車体客室見付の見直しや6050系に準じた前面スタイルへの変更、ボルスタレス台車の採用など大幅に変化した。 同時に、東武初のVVVFインバータ制御車である10080系が1編成試作されている。 1992年(平成4年)以後は、10030系を基本にバリアフリー対策や空調設備見直し、および雪害対策の強化を図った10050系が登場、10000系列は総勢486両が製造された。 2007年(平成19年)からは車内設備や保安装置を中心にリニューアル工事が施工されている。 更新車は外見上では前面のスカートとHID前灯、側面幕板部分の車外スピーカーが印象的だが、このほかにもパンタグラフの一部撤去やシングルアーム化が行われた編成も登場している。 余談であるが、8000系などの鋼製一般車が白地にブルーの濃淡帯に塗装変更された際に、ステンレスカーについても同様のカラーリングに改めようという計画がなされ、 10030系の先頭車1両にブルーの帯を貼り付け視認性を確認したことがあったが、結局は定着せず、ステンレスカーはロイヤルマルーンの帯を引き続き使用することとなった。 なお東武は、2013年より野田線系統で運用されていた8000系を置き換えるべく、60000系を製造しているが、同時に50000系列の投入にともなう30000系の地上線転用によって、 余裕の出た10000系列も野田線に転属することとなった。この転属に際しては60000系と同一のカラースキームの帯すなわち、野田線専用カラーであるフューチャーブルーとスプライトグリーンの帯をまとい、「青い帯の10030系」として話題をさらった。 今後も60000系の投入と平行して本系列の転属が行われ、8000系を順次置き換える予定である。 イラスト作成に当たって 8000系と同じく、東武を代表する通勤電車のひとつです。浅草駅に来るとよく普通電車ホームにやってくるアレです、アレ。 ちょっと前までなら8000系もいたんですが、今や浅草口に顔を出す一般車両はほぼ10000系列、たまに30000系と言った具合です。 さてイラストですが、上段から10000系登場当時(11801F)、10000系修繕車(11606F)、10030系登場時(11031F)、10030系修繕車(11445F)、 10050系(11655F)、そして唯一のVVVFインバータ車である10080系(11480F)、野田線仕様(11652F)を描いてみました。
https://w.atwiki.jp/kobuchi/pages/99.html
東武鉄道唱歌2023・東武線の巻 作詞:古淵工機 作曲:多梅稚 おなじみの鉄道唱歌のメロディに乗せて、東武鉄道(伊勢崎・日光線系統)を歌ってみました。 1.雷門(かみなりもん)も程ちかき 墨田(すみだ)の川に寄り添いて 建てる白亜(はくあ)の駅舎(えきしゃ)より 始まる道は東武線(とうぶせん) 2.浅草(あさくさ)いでてその次は 業平橋(なりひらばし)の停車場(ていしゃじょう) 右は新たな名所なる あれぞ東京晴空塔(とうきょうスカイツリー) 3.間もなくとまる曳舟(ひきふね)の 由来(いわれ)といいしその水は 今や姿も見えずして 名のみぞ駅にのこりたり 4.この駅よりは乗り換えて 小村井(おむらい)吾嬬(あずま)うちすぎて 次の亀戸水神(かめいどすいじん)の その御社(みやしろ)ぞ程ちかし 5.はやも着きたる亀戸(かめいど)は 学問(まなび)の神のあるところ 東の宰府(さいふ)と呼ばれたる 天満宮(てんまんぐう)はここぞかし 6.また曳舟に立ちかえり 百花(ももはな)かおる向島(むこうじま) すぎればはやも荒川の ほとりに近き鐘ヶ淵(かねがふち) 7.またたくの間に飛ぶがごと 堀切(ほりきり)牛田(うしだ)過ぎ去りて ゆけば程なく北千住(きたせんじゅ) 東武線路の興(おこ)りの地 8.小菅(こすげ)五反野(ごたんの)梅島(うめじま)も いつしかあとに立ち去りて 大師(だいし)に名高き西新井(にしあらい) すぎればすぐに竹ノ塚(たけのつか) 9.谷塚(やつか)のつぎの草加(そうか)にて 販(ひさ)ぐは草加煎餅(そうかせんべい)よ 形屋(かたや)ならびし広野(ひろの)さえ 今や屈指の住宅地 10.松原(まつばら)新田(しんでん)蒲生(がもう)駅 連なる稲田昔にて 今ぞ輝(かがよ)う新市街 新越谷(しんこしがや)に着きにけり 11.越谷(こしがや)いでて聞こえたる 声のあたりをながむれば 雁(かり)鴨(かも)白鷺(はくろ)鳩(はと)雀(すずめ) 群れなす様ぞおもしろや 12.見るも一興(いっきょう)その次は かねて音にも聞きつらん ここぞ武里(たけさと)一ノ割(いちのわり) 呑龍上人(どんりゅうしょうにん)生まれの地 13.列車ははやも春日部(かすかべ)の その停車場(ていしゃば)に着きにけり 岩槻(いわつき)野田(のだ)に氷川宮(ひかわみや) 行くはここにて乗り換えよ 14.姫宮(ひめみや)すぎて杉戸町(すぎとまち) 東武動物公園(とうぶどうぶつこうえん)は この駅おりて程ちかし 北には宿場の跡もあり 15.和戸(わど)の駅へと着きねれば 施餓鬼(せがき)に名を得し永福寺(えいふくじ) 高野(たかの)の村の松林(しょうりん)に 響くか鳥の啼(な)く声よ 16.米津(よねづ)が城の置かれたる 久喜(くき)駅すぎてその次は 関東最古(かんとうさいこ)の大社(たいしゃ)とぞ その名に聞きし鷲宮(わしのみや) 17.花崎(はなさき)加須(かぞ)もうちすぎて はやも着きたる羽生(はにゅう)駅 さらに進みて大利根(おおとね)を わたりてゆかば上毛野(かみつけの) 18.つぎは茂林寺(もりんじ)青竜山(せいりゅうざん) 文福茶釜(ぶんぶくちゃがま)の伝えあり 鳥もつどえるその沼の 夏は蛍(ほたる)も見物かな 19.今や童(わらべ)の息災(そくさい)を 願いし行事(ぎょうじ)のはじまりは 徳松(とくまつ)公のおさめたる 城の置かれし館林(たてばやし) 20.醤油(しょうゆ)饂飩(うどん)に麦落雁(むぎらくがん) 唐山織(とうざんおり)も販げたり 東武線路はこの駅を わかれて進む三方面 21.渡瀬(わたらせ)田島(たじま)うちすぎて 下ればはやも佐野(さの)の市(まち) 朝日長者(あさひちょうじゃ)の説話(せつわ)ある 弁天池(べんてんいけ)やみてゆかん 22.さらに堀米(ほりごめ)吉水(よしみず)に 田沼(たぬま)や多田(ただ)もあとにして はやもつきたる葛生(くずう)には 石灰岩(せっかいがん)の石場(いしば)あり 23.また本線にたちかえり 多々良(たたら)の沼を左にて 県(あがた)福居(ふくい)に和泉(いずみ)駅 すぎればここぞ足利市(あしかがし) 24.ここは歴史に名の高き 足利氏(あしかがうじ)のゆかりの地 儒学(じゅがく)をときておしえたる その学校(まなびや)もここにあり 25.山辺(やまべ)韮川(にらがわ)すぎゆけば はやも太田(おおた)につきにけり 宿場のあとにさかゆるは 昴(すばる)のごとき重産業 26.新田義貞(にったよしさだ)築きたる 金山城(かなやまじょう)の城あとを 右にながめてそのつぎは 三枚橋(さんまいばし)の停車場(ていしゃじょう) 27.ここに流(なが)れし激流(たぎつせ)に 大岩おきてその上に 橋をかけたる治良門(じろえん)の ほまれぞ駅にのこりたり 28.藪塚(やぶづか)阿佐美(あさみ)もうちすぎて つきたる駅は新桐生(しんきりゅう) 左に見ゆる渡良瀬(わたらせ)の 流るるさまぞ美しき 29.西は京都(きょうと)の西陣(にしじん)に つがえし東の織物は これぞ名高き桐生織(きりゅうおり) 土産(みやげ)にするも興(きょう)なれや 30.相老(あいおい)長(ちょう)ずるその松は いまもこの地にありときく つぎは上州(じょうしゅう)赤城(あかぎ)駅 大間々(おおまま)あおぐ山おろし 31.またも復(お)ちゆく太田駅 乗り換え急ぎ本線を 細谷(ほそや)木崎(きざき)に世良田(せらだ)駅 またたく間にぞ進みゆく 32.境(さかい)剛志(ごうし)もうちすぎて ゆけば伊勢崎(いせさき)ステーション 伊勢(いせ)より分けて祀(まつ)りたる 宮居(みやい)ぞこの地の由来(いわれ)なり 33.太田に戻り竜舞(りゅうまい)を すぎたる次の小泉(こいずみ)は 利根(とね)の渡船(とせん)のあるところ 小泉城(こいずみじょう)のあと何処(いずこ) 34.つぎは篠塚(しのづか)本中野(ほんなかの) あたりはやがて成島(なるしま)の また左には多々良沼 ながめて戻る館林 35.またたちかえる杉戸より 日光線に乗り換えて つぎの幸手(さって)は雷電(らいでん)の 田神(たがみ)まつりし社あり 36.権現堂(ごんげんどう)のその水は むかしの利根の流れなり 春は桜の名所にて 川面に花もうつるらん 37.その水のぼり着きたるは ここ栗橋(くりはし)が宿場跡 船渡せるも昔にて いまは鉄橋ひとすじに 38.古河(こが)の渡しの近くなる 新古河(しんこが)駅もあとにして 柳生(やぎゅう)板倉(いたくら)藤岡(ふじおか)と その足取りも軽(かる)らかに 39.静和(しずわ)をすぎて 大平(おおひら)の 山のふもとをながむれば ここぞ葡萄(ぶどう)の産地なる 大平下(おおひらした)の里ぞかし 40.神明宮(しんめいぐう)の十千木(とおちぎ)は 栃木(とちぎ)の街の所以(いわれ)なり ここに開けし停車場(ていしゃば)を おりて蔵町(くらまち)見るもよし 41.次なる駅は新栃木(しんとちぎ) ここよりさらに乗り換えて 平川(ひらかわ)大塚(おおつか)壬生(みぶ)駅の あたりは古墳の数多し 42.国谷(くにや)安塚(やすづか)そのつぎは ここも遺跡の西川田(にしかわだ) さらに進みて江曽島(えそじま)を すぎればあれぞ宇都宮(うつのみや) 43.坂東三十三箇所(ばんどうさんじゅうさんかしょ)が そのひとつなる大谷寺(おおやじ)の 傍(はた)より出づる石材は 世に名も高き大谷石(おおやいし) 44.あとに名残は残れども 栃木に戻りその次は 標茅ヶ原(しめじがはら)の合戦場(かっせんば) 宿場のあとぞ見てゆかん 45.家中(いえなか)金崎(かなさき)楡木(にれぎ)駅 また飛ぶごとにすぎさりて 樅(もみ)をこの地にたくわえし その樅山(もみやま)に社あり 46.むかし壬生氏(みぶし)の築きたる 鹿沼(かぬま)の城はあともなく 北駅(きたえき)すぎて黒川(くろかわ)を わたりて進む鉄の路(みち) 47.次は板荷(いたが)に下小代(しもごしろ) 明神(みょうじん)駅もうちすぎて ゆけば会津(あいづ)の分かれ道 下今市(しもいまいち)の停車場 48.わたる大谷(だいや)の川むこう 次なる駅の大桑(おおくわ)の 由来(いわれ)は昔さかえたる 養蚕業(ようさんぎょう)の名残かや 49.鬼怒川(きぬがわ)渡り高徳(たかとく)に 新たな駅の築けるを その喜びぞ名に込めて 新高徳(しんたかとく)と名づけたり 50.小佐越(こさごえ)すぎて 見(まみ)ゆるは いで湯の煙遠近(おちこち)に 見よやあれこそ鬼怒川の 世にも名高き温泉場(おんせんば) 51.さらに奥へと進まれば 花も咲きたる公園地 新藤原(しんふじわら)のその先は 川治(かわじ)尾瀬(おぜ)にも至るべし 52.線路を西に乗り換えて 大谷に沿いて走りなば はやもみる間に止まりたる 東武日光(とうぶにっこう)ステーション 53.天下の将軍家康(いえやす)の みたま祀りし東照宮(とうしょうぐう) そのたもとには日暮(ひぐらし)の 陽明門(ようめいもん)も立てるなり 54.傍立(そばだ)つ山は二荒山(ふたらさん) ふもとに控ゆる輪王寺(りんのうじ) これら三つを合わすれば 日光三社(にっこうさんじゃ)と人の言う 55.先の帝(みかど)のやすまらる ところは田母沢御用邸(たもざわごようてい) 緑もふかき山間(やまあい)に 沢の流れもうつくしや 56.華厳(けごん)の滝はわが国の 三名瀑(さんめいばく)のひとつにて 百雷谷(ひゃくらいたに)にひびく如(ごと) 秋は紅葉(もみじ)もとりどりに 57.霧なす水の霧降(きりふり)に 芭蕉(ばしょう)たずねし裏見(うらみ)滝 竜頭(りゅうず)湯滝(ゆたき)もあわすれば これぞ日光五名瀑(にっこうごめいばく) 58.華厳の上にたたえたる 中禅寺湖(ちゅうぜんじこ)のたもとより 北へ進まば名に聞きし 戦場ヶ原(せんじょうがはら)もほど近し 59.寺にやしろに山水(さんすい)の ほかにこの地の名物は 蕎麦(そば)に蒟蒻(こんにゃく)湯葉(ゆば)もまた まことに旨(うま)きものぞかし 60.千住と久喜の間より 芽ぐみし時も昔にて やがて線路は這う蔦(つた)の 別(わか)るごとくに延ぶるべし 61.今や列車は昼も夜(よ)も 関八州(かんはっしゅう)を縦横(たてよこ)に やすむ間もなくはしりゆく 東武鉄道栄えあれ やすむ間もなくはしりゆく 東武鉄道栄えあれ
https://w.atwiki.jp/soscomp/pages/113.html
Rails によるアジャイルwebアプリケーション開発 この本はRailsの開発者の一人が書いた本で、 抑えておくとこ、理解しておくことが丁寧に書かれています 三宅芳雄教授オススメの1冊です SQLの絵本 これは必須ってことではないですが、Railsで使う以上SQLはどうしても必要なので コマンド、値の意味などの知っておくことは重要です。 これはガーデン5階においてあります。 君全体的に誤字脱字多いよ -- みみなし (2009-01-28 16 05 06) 名前 コメント このページへのアクセス数 total - today - yesterday - このページのタグ一覧 RoR 背後
https://w.atwiki.jp/net-k/pages/16.html
情報広域 サイト名 URL 概要 備考 Ruby on Rails with oiax http //www.oiax.jp/ 作りながら覚える形式 ★★★ Ruby on Rails Guides http //guides.rubyonrails.org/ Rails3のマニュアル(本家) ★★★ 株式会社ウサギィwiki http //wiki.usagee.co.jp/ruby/rails 株式会社ウサギィwiki (かなり詳しい) ★★★ 一般情報 サイト名 URL 概要 備考 Railsのセッションの仕組み http //maskana.homedns.org/rails/pro/body/39 low level life(Blog) http //www.lowlevellife.com/?p=483 Rails3のモデルをER図出力
https://w.atwiki.jp/kakis/pages/6469.html
ails /// / プリン、プディング \ lakta sid ailai(スライム) \
https://w.atwiki.jp/kippushiryo/pages/36.html
東武鉄道の硬券 入場券 東武普通入場券(硬券) 東武鉄道の一部有人駅では、窓口で硬券入場券が購入できます。 ただし通年販売は北千住駅のみで、他は記念入場券や期間限定品となる場合が多いです。
https://w.atwiki.jp/toburailwayunyo/pages/17.html
東武東上線土休日ダイヤ50090系運用(H26.03.26改正) 50090系の運用表です。 駅名表記(池=池袋、下=下板橋電留線、成=成増、志=志木、川=川越市、森=森林公園、小=小川町) 38運用 1202レ ●森534→池632 3303レ 池637→川720 3312レ 川740→池825 6011レ 池833→下837▲(電5) 6012レ ●下1821→池1825 7レ 池1830→小1930 72レ 小1942→池2049 17レ 池2100→小2200 108レ 小2217→森2229▲ 39運用 200レ ●森519→池636 711レ 池639→成701 714レ 成715→池735 511レ 池739→志812 522レ 志826→池856 6013レ 池901→下905▲(着発2) 6010レ ●下1720→池1724 3レ 池1730→小1830 68レ 小1842→池1949 13レ 池2000→小2100 104レ 小2109→森2122▲ 40運用 3204レ ●森615→池725 3207レ 池730→森834▲ 60レ ●森1559→池1649 1レ 池1700→小1800 66レ 小1812→池1919 11レ 池1930→小2030 102レ 小2039→森2052▲ 41運用 3210レ●森801→池915 313レ 池919→川1015 312レ 川1044→池1141 3225レ 池1147→森1301▲ 64レ ●森1759→池1849 9レ 池1900→小2000 100レ 小2012→森2024▲
https://w.atwiki.jp/milan1909/pages/17.html
railsアプリ開発に関して
https://w.atwiki.jp/wiki6_takt/pages/41.html
高度なRialsキャッシング 通常、ユーザーに関連するコンテンツによってページ・キャッシングは無効になりますが、これは各ユーザーのコンテンツが少しずつ異なるためです。JavaScript をクッキーと組み合わせて使うと、たとえカスタムのユーザー・データを表示する場合であってもページ・キャッシングを使うことができます。この記事では、 Ruby on Rails での高度なページ・キャッシングについて説明します。 ページ・キャッシングでは Rails がまったく関係しないことを思い出してください。ある意味で、これは良いことです。なぜなら素晴らしいパフォーマンスが得られるからです。Rails は一度 HTML ページを作成してそれをディレクトリーに置き、そしてそれを忘れてしまいます。それ以後アプリケーション・サーバーは、1 サイクルも使うことなく、そのページを提供します。パフォーマンスの観点から見ると、ページ・キャッシングは素晴らしいものです。 私はページ・キャッシングを好んで使用します。そして Rails はページ・キャッシングを単純かつ簡潔にしてくれます。たった 1 行のコードでキャッシュを有効にすることができます。さらに数行のコードを追加すれば、単純にファイルを削除することで、あるいは Rails の上位レベルの API を使うことで、キャッシュを失効させることができます。しかし、ここで問題があります。すべてのサイトにページ・キャッシングが使えるわけではありません。誰が見るかによって変化するデータがページにある場合には、ページ・キャッシングをすることはできません。また、いつページを失効させるかの判断が難しい場合には、ページ・キャッシングは非常に面倒になるかもしれません。 例えば、ChangingThePresent.org (囲み記事を参照) のほとんどすべてのページには、現在ログインしているユーザーに基づいて変化する何らかのユーザー・データがあります。図 1 は、私達の最新のホームページの 1 つのセクションを示しています。(これはまだ未完成であり、変更される可能性があります。) このページは比較的単純な問題を提示しています。ユーザーがログインしたかどうかを判断できれば、Flash や JavaScript、DHTML、あるいは他のブラウザー・ベースのコードを使って即座にビューをカスタマイズできるのです。この図を見ると、ログインしたユーザーは、ログアウトするか、あるいは自分のプロファイルを見ることができ、またログアウトしたユーザーは、サインアップするか、あるいはログインできることがわかります。 図 1. ChangingThePresent.org のログイン・ビューとログアウト・ビュー 単純な Rails アプリケーションの作成に役立つ記事は、何十というほどあります。このシリーズでは、単純なブログを作成するという基礎を越え、すべての Rails サイトが解決すべき問題に入り込みます。ここでは Rails の最適化方法や、サイトをより安定にするための方法について学びます。また、Rails の基本的な制約を、プラグインを追加することで回避する方法も学びます。このシリーズの各記事を読み終わるごとに、現実の世界で Rails サイトを動作させるための方法について、さらにもう少し知ることができるはずです。 図 2 は、ユーザーのデータを、もう少し高度なビューで示したものです。私達はこのビューをサイト全体で使っています。図 2 の 2 つのビューは大きく異なっています。ページ・キャッシングを処理するためには、このような違いのすべてに対応する必要があります。ログインした各ユーザーに対して、ページのログアウト部分を、ログインしたユーザーのログイン ID と写真を表示する部分で置き換える必要があります。各ユーザーはそれぞれ異なるデータを持つため、このコンテンツ部分をキャッシングしようとすると、もう 1 つ別のレベルの課題が提起されることになります。 図 2. 2 つの明確に異なるビュー この動作は ChangingThePresent.org に独特のものではありません。ユーザーのエクスペリエンスをパーソナライズし始めた瞬間から、変更されることがない Rails ページに対するキャッシングの使い方が制限されます。しかし少しカスタマイズすれば、実際にはこれらのページを非常に容易にキャッシュすることができるのです。 これらの問題を解決するための方法はいくつもあります。私にとって最も魅力的な方法は次の通りです。 Rails フレームワークの制約の中で処理を行い、ページ・キャッシングの代わりにフラグメント・キャッシングを使います。 ページの大部分をロードし、次に JavaScript と Ajax を使って、そのページの一部の動的な部分をロードします。サーバー・サイド・コードはユーザーがログインしているかどうかを検出し、そして適当な部分を Ajax で描画します。 何らかのユーザー状態 (例えばユーザーがログインしているかどうか、など) を、クライアント・サイドのクッキーに保存します。次にクッキーの内容に基づいて、JavaScript でページの表示を動的に変更します。 この 3 つの方法の中で、私は文句なしに 3 番目の方法を好みます。その理由は、最初の方法と 2 番目の方法では、いやでも Rails アプリケーションが入り込んでくるからです。究極的なスケーラビリティーを望む場合には、可能な限り、静的なコンテンツを処理したいものです。この記事では、3 番目の方法に焦点を絞ることにします。ただしこの方法を、失っては困る非常に機密性が高いもの (ICBM (大陸間弾道ミサイル) の発射コードやクレジットカード番号など) を保存するためには使わないでください。私達の限定されたデータ・セットに関しては、この解決方法で問題はありません。 show-and-tell か hide-and-seek か 私はホームページのキャッシングを初めて試したとき、単純にリンクを JavaScript で置き換えてしまうという決断をすることもできました。この方法は、show-and-tell と考えることができます。ログインしたユーザーに関して知っていることに基づいて、JavaScript を使って Web ページの一部を選択的に置き換えたり、あるいは選択的に挿入したりすることで、そのユーザーに対して適切な話をすることができるのです。これをさらに分解すると、次のようになります。 すべてのユーザーに共通な要素のみを持つ Web ページを作成します。 ユーザーがログインしたら、そのユーザーに関するいくつかのデータ (ログインなどのデータ) をクッキーに置きます。 次に、クッキーの内容に基づいて、JavaScript を使って HTML フラグメントを挿入することでページの残り部分を描画します。 ChangingThePresent のホームページの場合、ログインしたユーザーに基づいて表示すべきリンクのセットは 2 つしかなかったため、show-and-tell の方法では過剰でした。そこで私は、私が hide-and-seek と呼ぶ、2 番目の方法を選びました。この方法では、すべてのユーザーに共通のページ要素をすべて表示し、そして変化する表示部分として考えられる全データを、隠しバージョンとして持ちます。これが hide-and-seek の hide の部分です。次に、ユーザーのロールに基づいて、JavaScript を使って表示用の文書の中でそのユーザー用の表示部分を見つけます。これが seek の部分です。考えられる全バージョンのデータを用意しておくのは過剰と思われるかもしれませんが、さまざまなセキュリティー・ロールに応じてさまざまな機能を選択的に有効にしたい場合には、これは実は非常に一般的です。そして hide-and-seek は ChangingThePresent のホームページには最適なのです。この方法を実現するためには次のことを行います。 すべてのユーザーに共通の要素のみを持つ Web ページを作成します。 ユーザー群をタイプごとに分けます。各ユーザー・タイプに対してコンテンツのバージョンを追加します。この場合では、ChangingThePresent のホームページに関するユーザー・タイプは、ログインしたユーザーとログアウトしたユーザーです。最初はこのコンテンツを隠します。 ユーザーがログインしたら、一群のユーザーを区別する何らかのデータ (ユーザー・ロールやログイン状態など) をクッキーに置きます。 ユーザーがページにアクセスしたら、そのユーザー・タイプに応じたバージョンのコンテンツを選択的に表示します。 hide-and-seek を実装する ChangingThePresent のホームページの場合、hide-and-seek の実装は驚くほど簡単です。図 1 で、このホームページがユーザーのアカウントに関連するいくつかのリンクを示す部分を持っていたことを思い出してください。これらのリンクは、ユーザーがログインしているかどうかによって変化します。最初の仕事は、このページのすべての共通コンテンツを作成することです。ここではその説明を省略します。2 番目の仕事は、ユーザーがログインしているかどうかによらず、すべてのユーザーに対するすべての動的コンテンツを表示することです。 リスト 1. 動的コンテンツの全バージョンを 1 つのビューの中に作成する div id='logged_out' %= link_to "login", controller = 'members', action = 'login' % br / %= link_to "register", controller = 'members', action = 'signup' % /div div id='logged_in' style="display none;" %= link_to "your profile", controller = 'profiles', action = 'show' % %= link_to "logout" , controller = "members", action = "logout" % /div my profile リンクに注目してください。このリンクは最初、あるユーザー固有のプロファイルを指していました。しかしそれでは私達のホームページのキャッシングが壊されてしまいます。そこでこのリンクを、ユーザー ID を持たない索引アクションを指すようにします。そうするとこの索引アクションは、このユーザーを正しいプロファイル・ページにリダイレクトします。 リスト 2. ユーザーを正しいプロファイル・ページにリダイレクトする def index redirect_to my_profile_url end リスト 2 の my_profile_url は、ユーザーのタイプに基づいて適切なプロファイル URL を判断するメソッドです (ユーザー・タイプには、celebrity、advisor、member があります)。ユーザー・タイプごとに別々のプロファイル・ページがあります。この時点でアプリケーションは完全に機能しますが、ここには 4 つのリンク (logged_in 用と logged_out 用それぞれに 2 つのリンク) があります。 login register your profile logout 次のステップは、現在のユーザー・タイプを保持するクッキーを取得することです。ChangingThePresent の場合には、現在のログイン ID を持つクッキーを、ログイン時に作成します。そしてログアウト時にクッキーを破棄します。 リスト 3. ログイン時とログアウト時にクッキーを作成し、破棄する def login if request.post? self.current_user = User.authenticate(params['user_login'], params['user_password']) ... if logged_in? set_cookies ... end end def logout end private def set_cookies cookies[ login] = current_user.login cookies[ image] = find_thumb(current_user.member_image) end def logout cookies.delete login cookies.delete image ... end リスト 3 の logged_in? は、カレント・ユーザーがログインしていると真を返すプライベート・メソッドです。上記の Rails メソッドは、ユーザーがログインすると 3 つのクッキーを作成し、ログアウトするとそれらを削除します。データについて心配する必要はありません。まだデータは必要ないのです。ここでは単に、あるユーザーがログインしているかどうかを、Rails フレームワークを呼び出さずに判断できるようになったことを理解してください。ただし、クッキーの有効期限はサイトの有効期限のポリシーと必ず一致する必要があります。この場合は一致しているため、ページ・キャシングの準備は完了です。 次のステップは、ユーザーのクッキーに基づいて適切なエントリーを選択的に表示したり隠したりすることです。ここでは public/javascripts/application.js に次の JavaScript を追加しました。 リスト 4. login の div を表示したり隠したりする JavaScript サポート function readCookie(name) { var nameEQ = name + "="; var ca = document.cookie.split(';'); for(var i=0;i ca.length;i++) { var c = ca[i]; while (c.charAt(0)==' ') c = c.substring(1,c.length); if (c.indexOf(nameEQ) == 0) { return c.substring(nameEQ.length,c.length); } } return null; } function handle_cached_user() { var login_cookie = readCookie('login'); var logged_in = document.getElementById('logged_in'); var logged_out = document.getElementById('logged_out'); if(login_cookie == null) { logged_in.style.display = 'none'; logged_out.style.display = 'block'; } else { logged_out.style.display = 'none'; logged_in.style.display = 'block'; } } 最初の関数は JavaScript からクッキーの値を読み取り、2 番目の関数は DOM を操作します。Prototype ライブラリーを使うと、このコードを単純にすることができますが、ここではすべての読者に明確にわかるように基本的な DOM 参照を含めています。最後のステップは、ページがロードされた時に JavaScript 関数を呼び出すことです。そこでレイアウトに下記を追加します。 リスト 5. ページをロードする際に JavaScript 関数を呼び出す script type="text/javascript" window.onload = function() { handle_cached_user(); %= render_nifty_corners_javascript % %= yield javascript_window_onload % } /script これは単純な JavaScript です。ページをロードする際に handle_cached_user 関数をロードすると、今度はこの関数が適切なビットを表示したり隠したりします。これでコントローラーに下記を追加すれば、安全にページ・キャッシングを有効にすることができます。 caches_page index そしてこれは完璧に動作します。何らかの理由でフロント・ページを失効させたい場合には、やはり定期的にキャッシュからそのページを削除する必要があります。そのためには単純に、定期的に public/index.html を削除します。hide-and-seek の方法は、いくつかのユーザー分類を持つページに対しては有効ですが、図 2 に示すユーザー部分には使えません。この部分については、hide-and-seek の方法と show-and-tell の方法の両方を組み合わせて使う必要があります。 show-and-tell を実装する 図 2 をもう 1 度見てください。hide-and-seek を使って、(ユーザーがログインしているかどうかによって) その部分の適切なバージョンを選択し、そして次に show-and-tell の方法を使って、(先ほどリスト 3 の 4 行目と 5 行目で作成したクッキーの内容に基づいて) ページの動的部分にデータを追加します。show-and-tell では、1 人のユーザーに合致するようにわざわざページの要素を変更していることを思い出してください。 まず、ログアウトしたユーザー用の部分とログインしたユーザー用の部分という各部分を描画する、静的なコンテンツがあります。ここではユーザーがログアウトしているとします。そこで、display none というスタイルを付加することで logged_in の div を隠します。後で、それらを必要に応じて JavaScript を使って表示したり隠したりすることができます。各 div の識別に logged_in と logged_out という先ほどと同じ 2 つの名前を使っているため、ホームページ用に作成した JavaScript を変更する必要がないことに注意してください。 リスト 6. ログイン部分とログアウト部分の両方を描画する div class="boxRight sideColumnColor" div id='logged_in' %= render partial = 'common/logged_in' style="display none; % /div div id='logged_out' %= render partial = 'common/logged_out' % /div /div 次に、下記は logged_in 部分のコンテンツです。動的コンテンツを含む各 HTML コンポーネントが ID を持っていることに注意してください。そのため、後で JavaScript を使って各コンポーネントを見つけ、置き換えることができます。 リスト 7. logged_in 部分を表示する div id='logged_in' style="display none;" %= link_to %( span class="mainBodyDark" Hi, /span ) + %( span class="textLarge mainBodyDark" b id='bold_link' ) + "my_login" + %( /b /span ), { controller = 'profiles', action = 'show', id = 'my_login'}, { id = 'profile_link'} % br/ div id='picture_and_link' a href="http //member/my_login" id='link_for_member_thumbnail' img id='member_thumbnail' alt="Def_member_thumbnail" src="/images/default/def_member_thumbnail.gif" / /a /div div id="not_mine" Not my_login? /div br/ %= image_button "logout", controller = "members", action = "logout" % Rails をよく知っている人であれば、いくつかのカスタム・ヘルパー関数に気付いたと思います。これを見ると、ページがロードされるごとに JavaScript を使って置き換えなければならない明確な動的コンテンツが 4 つあることがわかります (つまり 3 ヵ所にログインがあり、1 ヵ所にメンバーの画像があります)。この JavaScript コードは、handle_cached_user 関数に対する変更と、動的ユーザーに対するページの更新を処理するための新しいメソッドで構成されています。私はこの記事のために、コードを少し単純にしました。下記の関数を application.js ファイルに追加します。 リスト 8. ユーザー部分の要素を置き換える function handle_user_partial() { var login_cookie = readCookie('login'); var image_cookie = readCookie('image'); var profileLink = document.getElementById('profile_link'); profileLink.href = '/member/' + login_cookie; document.getElementById('bold_link').firstChild.nodeValue=login_cookie; document.getElementById('not_mine').firstChild.nodeValue="Not " + login_cookie + "?"; document.getElementById('link_for_member_thumbnail').href="/member/" + login_cookie; document.getElementById('member_thumbnail').src=image_cookie.replace(/%2[Ff]/g,"/"); document.getElementById('member_thumbnail').alt=login_cookie; } リスト 8 の JavaScript 関数は、まずクッキーを読み取り、そして DOM ツリーの 1 つの部分 (profile_link という、カレント・ユーザーのプロファイルへのリンク) を取得します。次に、handle_user_partial は下記を行います。 ログインしたユーザーの名前 (login_cookie に保存されています) を my_login で置き換え、そのユーザーのプロファイル・ページに対する正しい URL を作成します。 ログインしたユーザーの名前を、ログインしたユーザーを表す太字のテキストを含む DOM 要素の中に挿入します。 「Not login?」という単純な文を、login 部分に logout キャプションを含む DOM 要素の中に挿入します。 メンバーの画像を含む dom 要素を見つけ、汎用の画像のための画像 URL を、(image_cookie の中にある) メンバーの画像の URL で置き換えます。 また、万が一画像が表示されない場合に備えて、画像の alt タグを login 名で置き換えます。 DOM をナビゲートする際には、直接 DOM 要素に行く必要がある場合や、 (例えばテキストを処理している場合など)、その要素の特定の子が必要になる場合があります。ここでは、DOM 項目の中で見つけたい最初の子要素を、firstChild 関数を使って見つけています。Prototype ライブラリーを使うと、わかりやすい構文を使って少し容易に特定の DOM 要素を処理することができます。しかしこの点はこの記事の対象範囲外なので、触れないことにします。 既にすべてのクッキーを作成したので、最後のステップは既存の handle_cached_user 関数から JavaScript を呼び出すことです。この関数が public/javascripts/application.js の中にあることを思い出してください。 リスト 9. handle_cached_user に handle_user_partial 関数を追加する function handle_cached_user() { var login_cookie = readCookie('login'); var logged_in = document.getElementById('logged_in'); var logged_out = document.getElementById('logged_out'); if(login_cookie == null) { logged_in.style.display = 'none'; logged_out.style.display = 'block'; } else { handle_user_partial(); logged_out.style.display = 'none'; logged_in.style.display = 'block'; } } handle_cached_user の else 条件に追加されている追加の行に注意してください。この行は logged_in という DOM 要素を見えるようにする前に、適切な置き換えを行います。あとは、今回の記事と先月の記事で説明した、ページ全体をキャッシュするためのページ・キャッシング・ディレクティブを使うだけです。 まとめ 今回説明した高度な方法によって、多くの扉が開かれます。ChangingThePresent.org では、非常に単純な時間ベースのスイーパーを使ってページの75% 以上をキャッシュできると見積もっています。それよりもほんの少しだけ高度なスイープ手法を使えば、90% を軽く越える、あるいはそれ以上のページ・ヒットをキャッシュできるはずです。私達の積極的な画像キャッシング計画を考慮に入れれば、アプリケーション・サーバーにアクセスしに行くのは、すべての Web リクエストの 1% から 3% に過ぎないでしょう。 ただし、欠点も忘れないでください。このシステムは大幅に複雑になりました。以前よりもずっと複雑な HTML コードを維持する必要があり、HTML と JavaScript を必ず同期させる必要があります。しかし良い点として、より高いパフォーマンスが本当に必要な場合には、最も単純で最も効果的なキャッシング方法を使うことができます。ぜひ皆さんも試しに ChangingThePresent.org のサイトから、そのホームページをロードしてください。次に最上位レベルの各メニューをロードしてください。選択できる最上位レベルのメニューが 6 つある中で、私達が 4 つをページ・キャッシングしていることに気付くと思います。アカウントを作成し、それぞれをリロードしてください。どのページがキャッシュされているかわかるでしょうか。